package br.com.minhabiblia.entidade.db;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Transient;

import br.com.minhabiblia.entidade.MinhaBibliaOnLineEntidade;

import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.Text;

@Entity
@Table (name = "Favorito")
public class Favorito extends MinhaBibliaOnLineEntidade {
	
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key id;
	
	@Column (name = "testamento", nullable = false)
	private String testamento;
    
	@Column (name = "livro", nullable = false)
	private String livro;

	@Column (name = "capitulo", nullable = false)
	private Integer capitulo;
	
	@Column (name = "verso", nullable = false)
	private Integer verso;
	
	@Basic
	private Text text;

	@Column (name = "tags")
	private String tags;
	
	@ManyToOne (fetch = FetchType.EAGER)
	@JoinColumn (name = "usuario")
	private Usuario usuario;
	
	@Transient
	private String texto;
	
	public void prePersist() {
		setText(new Text(getTexto()));
	}
	
	public void postLoad() {
		setTexto(getText().getValue());
	}

	public Key getId() {
		return id;
	}

	public void setId(Key id) {
		this.id = id;
	}
	
	public String getTestamento() {
		return testamento;
	}

	public void setTestamento(String testamento) {
		this.testamento = testamento;
	}

	public String getLivro() {
		return livro;
	}

	public void setLivro(String livro) {
		this.livro = livro;
	}

	public Integer getCapitulo() {
		return capitulo;
	}

	public void setCapitulo(Integer capitulo) {
		this.capitulo = capitulo;
	}

	public Integer getVerso() {
		return verso;
	}

	public void setVerso(Integer verso) {
		this.verso = verso;
	}

	public Text getText() {
		return text;
	}

	public void setText(Text text) {
		this.text = text;
	}

	public String getTags() {
		return tags;
	}

	public void setTags(String tags) {
		this.tags = tags;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public String getTexto() {
		return texto;
	}

	public void setTexto(String texto) {
		this.texto = texto;
	}
	
	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Favorito) {
			Favorito outroFavorito = (Favorito) obj;
			
			boolean livrosIguais = getLivro().equals(outroFavorito.getLivro());
			boolean capitulosIguais = getCapitulo().equals(outroFavorito.getCapitulo());
			boolean versosIguais = getVerso().equals(outroFavorito.getVerso());
			boolean tagsIguais = getTags().equals(outroFavorito.getTags());
			
			return livrosIguais && capitulosIguais && versosIguais && tagsIguais;
		}
		
		return false;
	}
	
	@Override
	public String toString() {
		return getLivro() + " " + getCapitulo() + ":" + getVerso() + " tags:'" + getTags() + "'";
	}
}